﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp;
using Volo.Abp.Domain.Services;

namespace TestApp.BookStore.Authors
{
    // 定义一个作者管理类，继承自DomainService
    public class AuthorManager : DomainService
    {
        // 定义一个私有只读字段，用于存储作者仓库接口的实例
        private readonly IAuthorRepository _authorRepository;
        
        // 构造函数，通过依赖注入获取IAuthorRepository的实例
        public AuthorManager(IAuthorRepository authorRepository)
        {
            _authorRepository = authorRepository;
        }

        // 异步创建作者的方法
        public async Task<Author> CreateAsync(
            [NotNull] string name, // 作者名称，不能为空
            DateTime birthDate, // 作者出生日期
            [CanBeNull] string shortBio = null) // 作者简介，可以为空
        {
            // 检查名称是否为空或仅包含空白字符
            Check.NotNullOrWhiteSpace(name, nameof(name));

            // 异步查找是否已存在同名作者
            var existingAuthor = await _authorRepository.FindByNameAsync(name);
            if (existingAuthor != null)
            {
                // 如果已存在同名作者，抛出异常
                throw new AuthorAlreadyExistsException(name);
            }

            // 创建并返回新的作者实例
            return new Author(
                GuidGenerator.Create(), // 生成新的GUID作为作者ID
                name, // 作者名称
                birthDate, // 作者出生日期
                shortBio // 作者简介
            );
        }

        // 异步更改作者名称的方法
        public async Task ChangeNameAsync(
            [NotNull] Author author, // 要更改名称的作者实例，不能为空
            [NotNull] string newName) // 新的作者名称，不能为空
        {
            // 检查作者实例和新的名称是否为空
            Check.NotNull(author, nameof(author));
            Check.NotNullOrWhiteSpace(newName, nameof(newName));

            // 异步查找是否已存在同名作者
            var existingAuthor = await _authorRepository.FindByNameAsync(newName);
            if (existingAuthor != null && existingAuthor.Id != author.Id)
            {
                // 如果已存在同名作者且不是当前作者，抛出异常
                throw new AuthorAlreadyExistsException(newName);
            }

            // 调用作者实例的方法更改名称
            author.ChangeName(newName);
        }
    }
}